//
//  BSDLocation.m
//  BaishidaiKnight
//
//  Created by mac book on 2019/1/24.
//  Copyright © 2019年 sy. All rights reserved.
//

#import "BSDLocation.h"
#import "AppDelegate.h"
#import <CoreLocation/CoreLocation.h>


@interface BSDLocation()<CLLocationManagerDelegate>

@property(nonatomic,strong) CLLocationManager* locationManager;

@end

const double pi = 3.1415926535897932384626;
const double a = 6378245.0;
const double ee = 0.00669342162296594323;


@implementation BSDLocation

+(instancetype)sharedManager{
    static dispatch_once_t onceToken;
    static BSDLocation* shareLocation;
    dispatch_once(&onceToken, ^{
        shareLocation = [[self alloc] init];
    });
    return shareLocation;
}

- (instancetype)init
{
    self = [super init];
    if ( self )
    {
        if ([CLLocationManager locationServicesEnabled]) {
            self.locationManager = [[CLLocationManager alloc] init];
            _locationManager.delegate = self;
            [_locationManager requestAlwaysAuthorization];
            _locationManager.desiredAccuracy = kCLLocationAccuracyBest; //控制定位精度,越高耗电量越大。
            _locationManager.distanceFilter = 100; //控制定位服务更新频率。单位是“米”
            [_locationManager startUpdatingLocation];
            if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0){
                [_locationManager setAllowsBackgroundLocationUpdates:NO];  //调用了这句,就会弹出允许框了.
            }
            
        }else{
            LocationInfoModel* model =[UserHandle shareInstance].locationInfo;
            if(!model)
                model =[[LocationInfoModel alloc]init];
            model.enabled = NO;
            model.lat = @"";
            model.lng = @"";
           
            [[UserHandle shareInstance] setLocationInfo:model];
            [[UserHandle shareInstance] synchronize];
            
        }
    }
    return self;
}

-(void)uploadLocation:(CLLocation*)location{
    
    LocationInfoModel* model =[UserHandle shareInstance].locationInfo;
    if(!model)
        model =[[LocationInfoModel alloc]init];
    model.enabled = YES;
    model.lat = [NSString stringWithFormat:@"%f",location.coordinate.latitude];
    model.lng = [NSString stringWithFormat:@"%f",location.coordinate.longitude];
   
    [[UserHandle shareInstance] setLocationInfo:model];
    [[UserHandle shareInstance] synchronize];
    
    
    if([[UserHandle shareInstance] loginState]){

        NSDictionary* arg = @{@"ince":@"set_emp_location",
                              @"emp_id":[UserHandle shareInstance].userId,
                              @"lat":model.lat,
                              @"lng":model.lng
                              
                              };
        [BSDNetTool PostURL:kHost  parameters:arg succeed:^(NSDictionary *data) {
            NSLog(@"data = %@",data);
            NSInteger flag = [[data objectForKey:@"status"]integerValue];
            if(flag == 1){
                NSLog(@"上传坐标%@",[data objectForKey:@"sucess"]);
            }else{
                NSLog(@"上传坐标%@",[data objectForKey:@"fail"]);
            }
            
        } failure:^(NSError *error) {
            NSLog(@"%@",error.description);
        }];

    }
}

#pragma mark - <CLLocationManagerDelegate>

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    
    CLLocation *location = locations.firstObject;
    CLLocationCoordinate2D empty = [BSDLocation transformFromWGSToGCJ:location.coordinate];
    CLLocation* emptyLocation = [[CLLocation alloc]initWithLatitude:empty.latitude longitude:empty.longitude];
    [self uploadLocation:emptyLocation];
    NSLog(@"la---%f, lo---%f",location.coordinate.latitude,location.coordinate.longitude);
    
}

/**
 *定位失败，回调此方法
 */
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"请在设置中打开定位" preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *ok = [UIAlertAction actionWithTitle:@"打开定位" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        NSURL *settingURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
        [[UIApplication sharedApplication]openURL:settingURL];
    }];
    UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        
    }];
    [alert addAction:cancel];
    [alert addAction:ok];
    
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    [appDelegate.window.rootViewController presentViewController:alert animated:YES completion:nil];
}




//WGS-84 到 GCJ-02 的转换
+(CLLocationCoordinate2D)transformFromWGSToGCJ:(CLLocationCoordinate2D)wgsLoc
{
    CLLocationCoordinate2D adjustLoc;
    if([self isLocationOutOfChina:wgsLoc]){
        adjustLoc = wgsLoc;
    }else{
        double adjustLat = [self transformLatWithX:wgsLoc.longitude - 105.0 withY:wgsLoc.latitude - 35.0];
        double adjustLon = [self transformLonWithX:wgsLoc.longitude - 105.0 withY:wgsLoc.latitude - 35.0];
        double radLat = wgsLoc.latitude / 180.0 * pi;
        double magic = sin(radLat);
        magic = 1 - ee * magic * magic;
        double sqrtMagic = sqrt(magic);
        adjustLat = (adjustLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
        adjustLon = (adjustLon * 180.0) / (a / sqrtMagic * cos(radLat) * pi);
        adjustLoc.latitude = wgsLoc.latitude + adjustLat;
        adjustLoc.longitude = wgsLoc.longitude + adjustLon;
    }
    return adjustLoc;
}


//判断是不是在中国
+(BOOL)isLocationOutOfChina:(CLLocationCoordinate2D)location
{
    if (location.longitude < 72.004 || location.longitude > 137.8347 || location.latitude < 0.8293 || location.latitude > 55.8271)
        return YES;
    return NO;
}

+(double)transformLatWithX:(double)x withY:(double)y
{
    double lat = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(abs(x));
    lat += (20.0 * sin(6.0 * x * pi) + 20.0 *sin(2.0 * x * pi)) * 2.0 / 3.0;
    lat += (20.0 * sin(y * pi) + 40.0 * sin(y / 3.0 * pi)) * 2.0 / 3.0;
    lat += (160.0 * sin(y / 12.0 * pi) + 320 * sin(y * pi / 30.0)) * 2.0 / 3.0;
    return lat;
}

+(double)transformLonWithX:(double)x withY:(double)y
{
    double lon = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(abs(x));
    lon += (20.0 * sin(6.0 * x * pi) + 20.0 * sin(2.0 * x * pi)) * 2.0 / 3.0;
    lon += (20.0 * sin(x * pi) + 40.0 * sin(x / 3.0 * pi)) * 2.0 / 3.0;
    lon += (150.0 * sin(x / 12.0 * pi) + 300.0 * sin(x / 30.0 * pi)) * 2.0 / 3.0;
    return lon;
}





@end
